
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
// __proto__是隐式原型（对象就有，一般指向父亲的prototype，即构造器的原型）
//__proto__===constructor.prototype
// prototype是显式原型(函数才会有)

// 一般是保存公共方法和公共属性

function Person(){

}
var person1=new Person();

// //实例的原型指向Person构造函数的原型
// console.log(person1.__proto__==Person.prototype);

// //实例的构造属性指向Person构造函数
// console.log(person1.constructor==Person);

// //Person构造函数的原型指向Function的原型
// console.log(Person.__proto__==Function.prototype);

// //Function原型的原型指向Object的原型
// console.log(Function.prototype.__proto__==Object.prototype);

// //Person原型的原型指向Object的原型
// console.log(Person.prototype.__proto__==Object.prototype);

// //Person原型的构造属性指向自己
// console.log(Person.prototype.constructor==Person);

// //Person的原型是给实例继承用的
// console.log(Person.prototype==person1.__proto__);

// //console.log(person1.prototype.constructor==undefined);//报错
// console.log(Object.__proto__);


//Object.prototype.__proto__=null;//这里就是原型的顶端了
// Function->Object
// Array->Object
// String->Object
// Date->Object


var a={};//等同于 var a=new Object();
console.log(a.__proto__==Object.prototype);
console.log(a.__proto__==a.constructor.prototype);
var A=function(){};
var a1=new A();
console.log(a1.__proto__==A.prototype);//a1.constructor.prototype
console.log(a1.__proto__==a1.constructor.prototype);
var a2=Object.create(a1);//这里create的对象，无法挂载到原型链
console.log(a2.__proto__==A.prototype);
console.log(a2.__proto__==a2.constructor.prototype);

{
    //原型链
    var A = function(){};
var a = new A();
console.log(a.__proto__); //A {}（即构造器function A 的原型对象）A.prototype
console.log(a.__proto__.__proto__); //Object {}（即构造器function Object 的原型对象）Object.prototype
console.log(a.__proto__.__proto__.__proto__); //null
}


    </script>
    
</body>
</html>
